﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOH_Pregunta : DAO{
        //Atributos de manejo de instancia (singleton)
        static DAOH_Pregunta instance = null;   
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.H_PreguntaDataTable H_preguntaTabla = new DataSetConsultora.H_PreguntaDataTable();
        private H_PreguntaTableAdapter H_preguntaTableAdapter = new H_PreguntaTableAdapter();
        // Dependencias de otros DAOs
        private DAOH_Respuesta miDAOH_Respuesta = DAOH_Respuesta.Instance;

        public static DAOH_Pregunta Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOH_Pregunta();
                        }
                    }
                }
                return instance;
            }
        }

        public void guardar(H_factor unH_factor, int id_cuestionario)
        {

            foreach (H_pregunta unaH_pregunta in unH_factor._preguntas)
            {
                // Inserta la H_pregunta en la db por medio del table adapter
                H_preguntaTabla = H_preguntaTableAdapter.Insertar(unaH_pregunta._nombre,
                                                unaH_pregunta._pregunta,
                                                unaH_pregunta._descripcion,
                                                unaH_pregunta._bloque,
                                                unH_factor._cod_h_factor,
                                                id_cuestionario,                 // <--- El id_cuestionario que venia pasando como parametro (para formar el ciclo, evitando la recursividad)
                                                unaH_pregunta._op_respondida
                                                );

                // Le seteo el id o codigo con el que fue insertada la pregunta
                unaH_pregunta._cod_h_pregunta = recolectarId();

                miDAOH_Respuesta.guardar(unaH_pregunta);

                
            }
        }

        
        public H_pregunta guardar(H_pregunta unaH_pregunta, int id_factor, int id_cuestionario)
        {

            // Inserta la H_pregunta en la db por medio del table adapter
            H_preguntaTabla = H_preguntaTableAdapter.Insertar(unaH_pregunta._nombre, 
                                            unaH_pregunta._pregunta, 
                                            unaH_pregunta._descripcion, 
                                            unaH_pregunta._bloque, 
                                            id_factor, 
                                            id_cuestionario,unaH_pregunta._op_respondida);
            
            // Retorno la H_pregunta insertada
            return recolectarUno();
        }

        public void actualizar(H_pregunta unaH_pregunta)
        {

            // Actualizo la Respuesta en la db pro medio de su table adapter
            H_preguntaTableAdapter.Actualizar(unaH_pregunta._nombre, 
                                              unaH_pregunta._pregunta, 
                                              unaH_pregunta._descripcion, 
                                              unaH_pregunta._bloque, 
                                              unaH_pregunta._cod_h_pregunta,unaH_pregunta._op_respondida);

        }

        public List<H_pregunta> cargar()
        {

            // Cargo los H_pregunta de la db
            H_preguntaTabla = H_preguntaTableAdapter.GetData();

            // Finalmente devuelvo la lista de H_preguntasCargados, recolectadas por la funcion            
            return recolectar();
        }

        public List<H_pregunta> cargar(Int32 cod_H_factor)
        {   // obtengo la empresa por id en empresaTabla
            H_preguntaTabla = H_preguntaTableAdapter.ConsultarPorFactor(cod_H_factor);

            // Finalmente devuelvo la lista de H_preguntasCargados, recolectadas por la funcion            
            return recolectar();
        }
        public List<H_pregunta> cargarPorC(Int32 cod_cuest)
        {   // obtengo la empresa por id en empresaTabla
            H_preguntaTabla = H_preguntaTableAdapter.ConsultarPor(cod_cuest);

            // Finalmente devuelvo la lista de H_preguntasCargados, recolectadas por la funcion            
            return recolectar();
        }

        private List<H_pregunta> recolectar()
        {

            // Creo la lista para recolectar y devolver los H_preguntas cargadas de la db
            List<H_pregunta> H_preguntasCargados = new List<H_pregunta>();

            // Recorro los H_preguntas de la tabla
            foreach (DataSetConsultora.H_PreguntaRow unaH_preguntaFila in H_preguntaTabla)
            {

                // Creo un H_pregunta y lo agrego a la lista de H_preguntas cargados
                H_preguntasCargados.Add(new H_pregunta(unaH_preguntaFila.id,
                                                       unaH_preguntaFila.Nombre,
                                                       unaH_preguntaFila.Pregunta,
                                                       unaH_preguntaFila.Descripción,                                                       
                                                       unaH_preguntaFila.Bloque,
                                                       unaH_preguntaFila.Opcion_Respondida,
                                                       miDAOH_Respuesta.cargar(unaH_preguntaFila.id)
                                                      )
                                        );

            }

            return H_preguntasCargados;
        }
        public H_pregunta recolectarUno()
        {

            // Finalmente retorno un nuevo objeto Empresa mapeado de la tabla
            return new H_pregunta(H_preguntaTabla[0].id,
                                  H_preguntaTabla[0].Nombre,
                                  H_preguntaTabla[0].Pregunta,
                                  H_preguntaTabla[0].Descripción,
                                  H_preguntaTabla[0].Bloque,
                                  H_preguntaTabla[0].Opcion_Respondida,
                                  miDAOH_Respuesta.cargar(H_preguntaTabla[0].id)
                                  );


        }

        private int recolectarId()
        {
            if (H_preguntaTabla.Count > 0)
            {
                return H_preguntaTabla[0].id;
            }

            return -1;
        }
    }
}
